# 默认参数
def defaultParam(a, b=2):
    print(a + b)


# defaultParam(10)
# defaultParam(1, 3)

# 不定长参数
def anyTupleParam(a, b, *c):
    print(a, b)  # 1 1
    print(c)  # (3, 4, 5)
    # 序列类型可以被 * 打散
    print(*c)  # 3 4 5


# anyTupleParam(1, 1, 3, 4, 5)
# anyTupleParam(1, 2, *(7, 8))
# anyTupleParam(1, 2, (7, 8))


def anyDictParam(a, b, **c):
    # 规范: 在形参中带*与**的,*后的变量名应该为args,**后跟的变量名应该时kwargs
    print(a, b)
    print(c)
    print(*c)
    print(c.items())
    print(*c.items())


# anyDictParam(1, 2, c=3, d=4)
# anyDictParam(1, 3, d=4)
# print('----------------')
# # 打散dict后，以关键字实参进行传参c=1,d=5
# anyDictParam(1, 2, **{'c': 1, 'd': 5}, e=6)


def namedParam(a, b, *args, c, d, **kwargs):
    # 命名关键字参数: 放到*与**之间的参数称之为命名关键字参数 ***
    print(a, b)
    print(args)
    print(c, d)
    print(kwargs)


# 错误示范
# namedParam(1, 2, 3, 4, 5, 6, a=1, b=2, c=3)
# namedParam(1, 2, 3, 4, 5, 6, c=100, d=200, m=1, n=2, j=3)


def unpacking():
    # 拆包
    # 一个元素对应一个变量
    a, b, c = [1, 2, 3]
    print(a)
    print(b)
    print(c)
    print('----------------')
    # 多个元素对应一个变量
    *a, b, c = [1, 2, 3, 4, 5, 6]
    print(a)
    print(b)
    print(c)
    print(*a)


# unpacking()

x = 123
y = 456


def paramScope():
    # 1 外部不能访问函数内部的变量
    # 2 函数内部能够访问函数外部的变量
    # 3 函数里面不能修改函数外部的变量
    # 4 global能让我们在函数里面去修改全局变量的值
    # 5 nonlocal 让嵌套函数能够修改嵌套函数之外的值
    x = 1
    print(x)
    global y
    y = y + 1
    print(y)
    b = 3

    def func3():
        nonlocal b
        b += 1
        print(b)

    func3()


paramScope()


def builtInFunc():
    # 内置函数
    # 绝对值
    print(abs(-5))

    # all(可迭代对象)# 返回的是布尔值
    # 可迭代对象里面的值全部为真才是真,其余为假
    # 可迭代对象是空则为真
    print(all([1, '', None]))
    print(all([1, 'aaa', 2]))
    print(all([]))
    print('------------------')
    # any(可迭代对象)：只要一个为真则返回true
    # 可迭代对象里面的值全部为假才是假，其余为真
    # 可迭代对象是空则为假
    print(any([0, '', None, 1]))
    print(any([0, '', None, []]))
    print(any([]))
    print('------------------')
    # max min sum
    a = [1, 2, 4, 5, 7]
    print(max(a))
    print(min(a))
    print(sum(a))
    print('------------------')
    # ascll 英文的字符编码
    # ord() 可以把字符转换成编码
    # chr() 可以把编码转换成字符
    print(ord('a'))
    print(chr(97))
    print('------------------')
    # 拉链函数 zip
    # 序列类型进行拉链
    t1 = ('a', 'b', 'c', 'd', 'e')
    t2 = [1, 2, 3, 4]
    print(list(zip(t1, t2)))
    print(dict(zip(t1, t2)))
    print('------------------')
    # exec 函数 可以执行字符串里面的代码 支持python语法
    exec('print(1)')
    print('------------------')
    exec('''for i in range(0,10):
        print(i)
    ''')

# builtInFunc()

